<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        "use strict";
        //1、变量必须声明
        //2、不允许使用with
        //with(window){};
        //3、强制开启eval作用域
        //eval("n=1+3+5");
        //console.log(n);
        //4、在严格模式下this不再默认指向window对象
        // function f1(){
        //     console.log(this);  //undefined
        // }
        // f1();
        //5、不再静默失败
        // var n=100;
        // delete n;
        // var obj={};  //使用字面量的形式定义对象
        // Object.defineProperty(obj,  //在对象obj中定义属性name值为tom
        //     'name',{
        //         value:"tom",
        //         writable:false,  //不允许修改
        //         configurable:true  //允许属性被删除
        //     }
        // );
        // delete obj.name;  //删除obj中的属性name
        // obj.name="mark";  //静默失败
        // console.log(obj.name);
        // //对象的定义
        // var obj2=Object.create(Object.prototype,{  //创建一个对象，原型为null
        //     "name":{  //定义属性name
        //         value:"foo",  //默认值 
        //         configurable:true  //可删除的属性
        //     }
        // });
        // console.log(obj2);
        // console.log(obj2.__proto__);
        //6对象的属性不允许重名
        // var obj={a:100,a:200};
        // console.log(obj.a);
        //7、不允许参数重名
        // function f1(p1,p1){
        // }
        // f1();
        //8、禁止使用八进制数字
        // var n1=077;  //在严格模式下不允许以0开始的八进制，但允许使用0o
        // console.log(n1);
        //使用0o声明是允许的
        var n2 = 0o77;
        console.log(n2);
        //9、函数须声明在顶层
        if (true) {
            function foo() {
                console.log("foo");
            }
        }
        //10、caller/callee 被禁用
        //(11)、对禁止扩展的对象添加新属性会报错
        // Object.preventExtensions(obj)；然后对obj增加属性则会报错。
        // (12)、delete不可删除属性(isSealed或isFrozen)的对象时报错
        // Object.isSealed() 方法判断一个对象是否被密封。Object.isFrozen()方法判断一个对象是否被冻结。
        // (13)、arguments严格定义为参数，不再与形参绑定，不允许对arguments赋值，arguments不再追踪参数的变化，禁止使用function直接引用caller和arguments
        // (14)、call/apply的第一个参数直接传入不包装为对象
        // (15)、call/apply/bind的第一个参数为null/undefined时，this为null/undefined
        // (16)、严格模式新增了一些保留字。
        // implements、interface、let、package、private、protected、public、static、yield、class、enum、export、 extends、import、super。
        foo();
    </script>
</body>

</html>